package tallerweb.sangucheto.controllers;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import tallerweb.sangucheto.beans.forms.IngredienteFormMo;
import tallerweb.sangucheto.beans.forms.VerSanguchetoFormMO;
import tallerweb.sangucheto.model.Ingrediente;
import tallerweb.sangucheto.utils.Sanguchetto;
import tallerweb.sangucheto.utils.Stock;

@Controller
public class DefaultController {
	
	

	//-------------------- sangucheto -----------------------------------------------------------------
	@RequestMapping(value = "/verSangucheto", method = {RequestMethod.POST, RequestMethod.GET })
	public ModelAndView verSanguchetoMethod( @ModelAttribute("mensaje") String mensaje,
										     @ModelAttribute("sinStock") String sinStock,
										     @ModelAttribute("noAgregado") String noAgregado){
			                                
		
		
		ModelMap modelMap = new ModelMap("modelMap");
		modelMap.put("verSanguchetoFormMO", new VerSanguchetoFormMO());
		modelMap.put("ingredientesStock", Stock.getInstance().listarIngredientesMayorACero());
		
		//para debug
		Sanguchetto.getInstance().verIngredientes();
		Sanguchetto.getInstance().verCondimentos();
		//
		
		modelMap.put("calculoPrecio", Sanguchetto.getInstance().getPrecio());
		modelMap.put("mensaje", mensaje);
		modelMap.put("sinStock", sinStock);
		modelMap.put("noAgregado", noAgregado);
		ModelAndView modelAndView = new ModelAndView("verSangucheto", modelMap);
		return modelAndView;
	}

	@RequestMapping(value = "/agregarIngrediente", method = {RequestMethod.POST, RequestMethod.GET }) //el link "agregar" no admite POST
	public String agregarIngrediente( @ModelAttribute("verSanguchetoFormMO") VerSanguchetoFormMO verSanguchetoFormMO,
			final RedirectAttributes redirectAttributes){
			
		String mensaje = new String("");
		String sinStock = new String("");
		
		Ingrediente ingredienteForm = Stock.getInstance().obtenerIngredientePorNombre(verSanguchetoFormMO.getIngrediente().getNombre());
		
		if(ingredienteForm != null){
			Integer cantidadEnStock = Stock.getInstance().obtenerStockDisponible(ingredienteForm);
			Integer cantidadEnSanguchetto = Sanguchetto.getInstance().getCantidadAgregadaDeIngrediente(ingredienteForm)+1;
			
			if(cantidadEnStock >= cantidadEnSanguchetto){	 //agregar porque alcanzará el stock
				Sanguchetto.getInstance().agregarIngrediente(ingredienteForm); 
	    	    mensaje = "Se agrego "+ ingredienteForm.getNombre();
			}else{
		    	mensaje = "No hay stock para agregar mas "+ ingredienteForm.getNombre();
		    	sinStock = ingredienteForm.getNombre();
		    }
			redirectAttributes.addFlashAttribute("mensaje", mensaje);
		    redirectAttributes.addFlashAttribute("sinStock",sinStock);
		}else{
			mensaje = "No existe el ingrediente "+ verSanguchetoFormMO.getIngrediente().getNombre()+" en stock";
	    	sinStock = verSanguchetoFormMO.getIngrediente().getNombre();
		}
			return "redirect:/verSangucheto";

	}

	@RequestMapping(value = "/eliminarIngrediente", method = {RequestMethod.POST, RequestMethod.GET })
	public String eliminarIngrediente(@ModelAttribute("verSanguchetoFormMO") VerSanguchetoFormMO verSanguchetoFormMO,
			  final RedirectAttributes redirectAttributes){
		
				String mensaje = new String("");
				String noAgregado = new String("");
		
				
				Ingrediente ingredienteForm = Stock.getInstance().obtenerIngredientePorNombre(verSanguchetoFormMO.getIngrediente().getNombre());
				
				if(ingredienteForm != null){
					Integer cantidadEnSanguchetto = Sanguchetto.getInstance().getCantidadAgregadaDeIngrediente(ingredienteForm);
					if(cantidadEnSanguchetto > 0){ //si esta agregado y se debe eliminar
						Sanguchetto.getInstance().eliminar(ingredienteForm);
						mensaje = "Se a eliminardo "+ ingredienteForm.getNombre()+ " del sangucheto";
			        }else{
			        	mensaje = "Aun no ha agregado "+ verSanguchetoFormMO.getIngrediente().getNombre()+ " en el sangucheto";
			        	noAgregado=verSanguchetoFormMO.getIngrediente().getNombre();
				    }
		        }
		        redirectAttributes.addFlashAttribute("mensaje", mensaje);
			    redirectAttributes.addFlashAttribute("noAgregado",noAgregado);  
			
		    	return "redirect:/verSangucheto" ;
	}
	
	@RequestMapping(value = "/confirmar", method = {RequestMethod.POST, RequestMethod.GET })
	public ModelAndView confirmarIngredientes(){
		ModelMap modelMap = new ModelMap("modelMap");
		
		List<Ingrediente> finalIngredientes = new ArrayList<Ingrediente>();
		
		for(Ingrediente ingrediente : Sanguchetto.getInstance().verIngredientes()){
			finalIngredientes.add(ingrediente);
			Stock.getInstance().restarStock(ingrediente, 1);
		}
		for(Ingrediente ingrediente : Sanguchetto.getInstance().verCondimentos()){
			finalIngredientes.add(ingrediente);
			Stock.getInstance().restarStock(ingrediente, 1);
		}
		
		
		modelMap.put("finalIngredientes", finalIngredientes);
		modelMap.put("finalPrecio", Sanguchetto.getInstance().getPrecio());
		
		ModelAndView modelAndView = new ModelAndView("sanguchetoFinal", modelMap);
		return modelAndView;
		
	}	
	
	@RequestMapping(value = "/comprarOtro", method = {RequestMethod.POST, RequestMethod.GET })
	public String comprarOtro(){
	
		    Sanguchetto.getInstance().vaciar();
			return "redirect:/verSangucheto";
	}
	
	
	@RequestMapping(value = "/cancelar", method = {RequestMethod.POST, RequestMethod.GET })
	public String cancelarIngredientes(){
		
		Sanguchetto.getInstance().vaciar();
		return "redirect:/verSangucheto";
		
	}	
	/*
	@RequestMapping(value = "/volver", method = {RequestMethod.POST, RequestMethod.GET })
	public ModelAndView volver(){
		
		Sanguchetto.getInstance().vaciar();
		
		
		return new ModelAndView("verSangucheto", new ModelMap());
		
	}	*/	
    //-------------------- stock -----------------------------------------------------------------
	@RequestMapping(value = "/altaIngrediente", method = { RequestMethod.POST,RequestMethod.GET })
	public ModelAndView mostrarAltaIngrediente() {

		ModelMap model = new ModelMap();
		model.put("ingrediente", new Ingrediente());
		return new ModelAndView("altaIngrediente", model);
	}

	@RequestMapping(value = "/CrearIngrediente", method = { RequestMethod.POST,	RequestMethod.GET })
	public ModelAndView mostrarCrearIngrediente(@ModelAttribute("ingrediente") Ingrediente ingrediente) {

		Stock.getInstance().agregarIngrediente(ingrediente);
		ModelMap model = new ModelMap();
		model.put("ingrediente", Stock.getInstance().listarIngredientesDisponibles());
		return new ModelAndView("redirect:altaIngrediente", model);
	}

	@RequestMapping(value = "/verStock", method = { RequestMethod.POST,	RequestMethod.GET })
	public ModelAndView mostrarVerStock() {

		ModelMap model = new ModelMap();
		LinkedList<Integer> numStock = new LinkedList<Integer>();

		for (Ingrediente ing : Stock.getInstance().listarIngredientesDisponibles()) {
			numStock.add(Stock.getInstance().obtenerStockDisponible(ing));
		}
		
		model.put("ingrediente", Stock.getInstance().listarIngredientesDisponibles());
		model.put("numStock", numStock);

		return new ModelAndView("verStock", model);
	
	}
	/*
	@RequestMapping(value = "/sumarStock", method = { RequestMethod.POST,	RequestMethod.GET })
	public ModelAndView mostrarSumarStock(@ModelAttribute("Ingrediente") Ingrediente ingrediente) {

		
		ModelMap model = new ModelMap();
		Ingrediente ing = new Ingrediente(); 
		model.put("Ingrediente", ing);
		model.put("ingredientes", Stock.getInstance().listarIngredientesDisponibles());
		return new ModelAndView("sumarStock", model);
	}
    */	
	@RequestMapping(value = "/setearStock", method = { RequestMethod.POST,	RequestMethod.GET })
	public ModelAndView mostrarSetearStock(@ModelAttribute("Ingrediente") Ingrediente ingrediente ,@RequestParam("stock") String stock) {
		
		Integer s =  Integer.parseInt(stock);
		//Stock.getInstance().agregarStock(ingrediente,s);
		
		//como no llegan los valores desde la vista los debo obtener recorriendo el Set de claves en Stock
		for(Ingrediente ingEnSet : Stock.getInstance().listarIngredientesDisponibles()){
			if(ingEnSet.getNombre().equals(ingrediente.getNombre())){
				Stock.getInstance().agregarStock(ingEnSet,s);
			}
		}
		ModelMap model = new ModelMap();
		
		Ingrediente ing = new Ingrediente(); 
		model.put("Ingrediente", ing);
		model.put("ingredientes", Stock.getInstance().listarIngredientesDisponibles());
		

		return new ModelAndView("redirect:sumarStock", model);
	}

	@RequestMapping(value = "/sumarStock", method = { RequestMethod.POST,	RequestMethod.GET })
	public ModelAndView mostrarSumarStock() {

		ModelMap model = new ModelMap();
		//IngredienteFormMo ingredienteFormMo = new IngredienteFormMo();
		Ingrediente ing = new Ingrediente(); 
		//model.put("Ingrediente", ingredienteFormMo);
		model.put("Ingrediente", ing);
		model.put("ingredientes", Stock.getInstance().listarIngredientesDisponibles());
		return new ModelAndView("sumarStock", model);
	}
	
	/*@RequestMapping(value = "/setearStock", method = { RequestMethod.POST,	RequestMethod.GET })
	public ModelAndView mostrarSetearStock(@ModelAttribute("Ingrediente") IngredienteFormMo ingredienteFormMo ) {
		
		Integer s =  ingredienteFormMo.getStock();
		
		//rearmar el objeto Ingrediente - domain object
		
		//Ingrediente ingrediente = new Ingrediente();
		//ingrediente.setNombre(ingredienteFormMo.getNombre()); //si llega el valor desde la vista
		//ingrediente.setPrecio(ingredienteFormMo.getPrecio()); //no llega el valor desde la vista
		//ingrediente.setTipo(ingredienteFormMo.getTipo());     //no llega el valor desde la vista
		
		
		//como no llegan los valores desde la vista los debo obtener recorriendo el Set de claves en Stock
		for(Ingrediente ingEnSet : Stock.getInstance().listarIngredientesDisponibles()){
			if(ingEnSet.getNombre().equals(ingredienteFormMo.getNombre())){
				Stock.getInstance().agregarStock(ingEnSet,s);
			}
		}
		
		
		ModelMap model = new ModelMap();
		Ingrediente ing = new Ingrediente(); 
		model.put("Ingrediente", ing);
		model.put("ingredientes", Stock.getInstance().listarIngredientesDisponibles());
		

		return new ModelAndView("redirect:sumarStock", model);
	}	*/
	@RequestMapping(value = "/eliminarStock", method = { RequestMethod.POST,	RequestMethod.GET })
	public ModelAndView mostrarEliminarStock(@ModelAttribute("Ingrediente") Ingrediente ingrediente) {

		
		ModelMap model = new ModelMap();
		Ingrediente ing = new Ingrediente(); 
		model.put("Ingrediente", ing);
		model.put("ingredientes", Stock.getInstance().listarIngredientesDisponibles());
		return new ModelAndView("eliminarStock", model);
	}
	
	@RequestMapping(value = "/vaciarStock", method = { RequestMethod.POST,	RequestMethod.GET })
  //public ModelAndView mostrarVaciarStock(@ModelAttribute("Ingrediente") Ingrediente ingrediente ,@RequestParam("stock") String stock) {
	public ModelAndView mostrarVaciarStock(@ModelAttribute("Ingrediente") Ingrediente ingrediente ) {
		
		
		//como no llegan los valores desde la vista los debo obtener recorriendo el Set de claves en Stock
		for(Ingrediente ingEnSet : Stock.getInstance().listarIngredientesDisponibles()){
			if(ingEnSet.getNombre().equals(ingrediente.getNombre())){
				Stock.getInstance().eliminarStock(ingEnSet);
			}
		}
		//Stock.getInstance().eliminarStock(ingrediente);
		
		ModelMap model = new ModelMap();
		
		Ingrediente ing = new Ingrediente(); 
		model.put("Ingrediente", ing);
		model.put("ingredientes", Stock.getInstance().listarIngredientesDisponibles());
		

		return new ModelAndView("redirect:eliminarStock", model);
	}
}